import initEvent from './event'
import store from './store'
import bridge from '@ynet/ynet-bridge'
import tools from '../../utils'


const app = {
	href(url) {
		window.location.href = "http://localhost:8080/"+url
	},
	/**
	 * vue顶级实例
	 */
	vm: null,
	/**
	 * 状态存储对象
	 */
	store,
	/**
	 * 传递参数（url参数以及前一个页面传递的参数）
	 */
	params: {},
	/**
	 * JSAPI集对象
	 */
	api: bridge,
	/**
	 * 工具集
	 */
	tools,
	/**
	 * 设备识别
	 */
	device: {
		specialSign: navigator.userAgent.indexOf('ynetBank') != -1,
		os: navigator.userAgent.indexOf('iPhone') > -1 ? 'ios' : 'android'
	},
	/**
	 * 添加监听DOM事件
	 * @param {String} event 事件名称 
	 * @param {Function} fn 事件回调函数 
	 * @param {Boolean} useCapture 是否捕获
	 */
	on (event, fn, useCapture = false){
		window.document.addEventListener(event, fn, useCapture)
	},
	/**
	 * 删除DOM事件监听
	 * @param {String} event 事件名称 
	 * @param {Function} fn 事件回调函数 
	 * @param {Boolean} useCapture 是否捕获
	 */
	off (event, fn, useCapture = false){
		window.document.removeEventListener(event, fn, useCapture)
	},
	/**
	 * 触发DOM事件
	 * @param {String} eventName 事件名称
	 * @param {Object} data 事件数据对象 
	 */
	trigger (eventName, data = {}){
		let event = document.createEvent('Events')
		event.initEvent(eventName, false, true)
		event.data = data
		document.dispatchEvent(event)
		return event;
	},
	/**
	 * 监听Native系统事件
	 * @param {String} eventName 事件名称
	 * @param {Function} fn 事件回调函数
	 */
	listen (eventName, fn){
		return app.api.addNotifyListener({name: eventName}, fn);
	}
}

/**
 * 初始化启动参数
 */

function initParamsInfo (){
	let searchParams = app.tools.deserializeObject((window.location.search || '').substring(1))
	let paramskey = searchParams._PARAMSKEY || ''
	let urlparams = searchParams._PARAMS || ''
	delete searchParams._PARAMSKEY
	delete searchParams._PARAMS

	return new Promise(resolve => {
		if(paramskey){
			app.api.getSessionStorage(paramskey, false).then(jsonData => {
				let params
				try{
					params = JSON.parse(jsonData)
				}catch(e){}
				app.params = Object.assign({}, searchParams, params)
				resolve()
			}, resolve)
		}else{
			if(urlparams){
				try{
					urlparams = JSON.parse(urlparams)
				}catch(e){
					urlparams = {}
				}
			}
			app.params = Object.assign({}, searchParams, urlparams)
			resolve()
		}
	})
}


export default function (options){

	const {store, vm} = options

	/**
	 * 合并到app对外暴露
	 */
	Object.assign(app, options)

	/**
	 * 添加系统平台类名
	 */
	window.document.body.classList.add('system_' + app.device.os)

	/**
	 * 初始化应用状态
	 */

	const initState = function(){
		/**
		 * 订阅客户端登录成功消息
		 */
		app.api.addNotifyListener({name: 'NEBULANOTIFY_loginSuccess'}, function(){
			store.dispatch('initStore', {app})
		})

		/**
		 * 初始化必要的数据状态
		 */
		Promise.all([initParamsInfo(), store.dispatch('initStore', {app})]).then(() => {
			/**
			 * 挂载vue实例
			 */
			vm.$mount('#app')
			/**
			 * 扩展事件
			 */
			initEvent(app)
			/**
			 * 解除AlipayJSBridgeReady订阅
			 */
			app.off('AlipayJSBridgeReady', initState)
		})
	}

	/**
	 * 兼容非指定客户端内运行
	 */
	app.device.specialSign ? app.api.ready(initState) : setTimeout(() => vm.$mount('#app'), 0)

	return app
}